﻿namespace Rsdn.Janus
{
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Text.RegularExpressions;
    using JetBrains.Annotations;
    using SmartApp;

    [Service(typeof(IFormatMessageHelperService))]
    public class FormatMessageHelperService : IFormatMessageHelperService
    {
        private readonly IServiceProvider _serviceProvider;

        public FormatMessageHelperService([NotNull] IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
            if (serviceProvider == null)
            {
                throw new ArgumentNullException("serviceProvider");   //MLHIDE
            }
        }

        /// <summary>
        /// Форматирует оценки.
        /// </summary>
        /// <param name="rate">Сумма оценок.</param>
        /// <param name="smile">Количество улыбок.</param>
        /// <param name="agree">Количество согласных.</param>
        /// <param name="disagree">Количество не согласных.</param>
        /// <returns>Форматированное представление оценок.</returns>
        public  string FormatRates(int rate, int smile, int agree, int disagree)
        {
            var list = new List<string>(4);

            if (smile != 0)
            {
                list.Add(smile + ":)");
            }

            if (agree != 0)
            {
                list.Add(agree + "+");
            }

            if (disagree != 0)
            {
                list.Add(disagree + "-");
            }

            if (rate != 0)
            {
                list.Add(rate.ToString());
            }

            return String.Join("/", list.ToArray());
        }

        /// <summary>
        /// Возвращает первое не пустое значение, 
        /// иначе - Аноним
        /// </summary>
        /// <param name="nick">Псевдоним пользователя.</param>
        /// <param name="realName">Реальное имя пользователя.</param>
        /// <param name="userName">Имя пользователя.</param>
        /// <returns>Первое не пустое "имя" пользователя, иначе - Аноним.</returns>
        public  string GetUserDisplayName(string nick, string realName, string userName)
        {
            if (!String.IsNullOrEmpty(nick))
            {
                return nick;
            }

            if (!String.IsNullOrEmpty(realName))
            {
                return realName;
            }

            if (!String.IsNullOrEmpty(userName))
            {
                return userName;
            }

            return SR.Forum.UserNickAnonymous;
        }

        /// <summary>
        /// Преобразовывает тип пользователя в строку.
        /// </summary>
        /// <param name="userClass">Тип пользователя. <see cref="UserClass"/></param>
        /// <param name="isHtml">Использовать подсветку.</param>
        /// <returns>Строковое представление ипа пользователя.</returns>
        public  string FormatUserClass(UserClass userClass, bool isHtml)
        {
            string result = String.Empty;

            switch (userClass)
            {
                case UserClass.Admin:
                    result = "admin";
                    if (isHtml)
                    {
                        result = "<font color='darkred'>" + result + "</font>";
                    }
                    break;

                case UserClass.Moderator:
                    result = "moderator";
                    if (isHtml)
                    {
                        result = "<font color='red'>" + result + "</font>";
                    }
                    break;

                case UserClass.Team:
                    result = "rsdn";
                    if (isHtml)
                    {
                        result = "<font color='blue'>" + result + "</font>";
                    }
                    break;

                case UserClass.Expert:
                    result = "expert";
                    if (isHtml)
                    {
                        result = "<font color='green'>" + result + "</font>";
                    }
                    break;
            }

            return result.Length > 0 ? "[" + result + "]" : result;
        }

        /// <summary>
        /// Форматирует тултип сообщения, указывая на тему, автора и дату постинга.
        /// </summary>
        /// <param name="subject">The subject.</param>
        /// <param name="date">The date.</param>
        /// <param name="nick">The nick.</param>
        /// <returns>Тултип сообщения.</returns>
        [NotNull]
        public string FormatMsgLinkTitle(string subject, DateTime date, string nick)
        {
            string formattedDate = date.ToString(Config.Instance.ForumDisplayConfig.DateFormat);

            return String.Format("\"{0}\",\r{1}, {2}", subject, nick, formattedDate);
        }

        /// <summary>
        /// Следующие пара методов выдернуты из исходников IT (с заметными доработками правда),
        /// так что все возможные вопросы к нему
        /// Перенес из MessageUtilities
        /// </summary>
        /// <param name="subjIn">The subj in.</param>
        /// <returns></returns>
        public string ReSubj(string subjIn)
        {
            string res;
            //Чистый subj без Re-префиксов
            string subj = Regex.Replace(subjIn, @"^Re(\[[0-9]+\]){0,1}: ", "");

            if (subjIn.Length >= 4 && subjIn.Substring(0, 4) == "Re: ")
            {
                res = "Re[2]: " + subj;
            }
            else if (subjIn.Length >= 3 && subjIn.Substring(0, 3) == "Re[")
            {
                int si = subjIn.IndexOf("[");
                try
                {
                    int nn = Int32.Parse(subjIn.Substring(si + 1, subjIn.IndexOf("]") - si - 1));
                    nn++;
                    res = "Re[" + nn + "]: " + subj;
                }
                catch (Exception)
                {
                    //На случай исключения принимаем Re равным 0
                    res = "Re: " + subj;
                }
            }
            else
            {
                res = "Re: " + subj;
            }

            return res;
        }

        /// <summary>
        /// Возвращает дату в виде строки
        /// Формат даты задется в настройках
        /// Время перводится в локальное компьютера
        /// Время на Rsdn Московское +3 GMT
        /// </summary>
        /// <param name="date">Входная дата.</param>
        /// <returns>дата в заданном формате</returns>
        public string GetDateAsString(DateTime date)
        {
            DateTime localDateTime = date;
            TimeZone zone = TimeZone.CurrentTimeZone;
            DaylightTime time = zone.GetDaylightChanges(DateTime.Today.Year);

            // переводим в GMT, учитывая летнее время
            int timeOffset = 3 + time.Delta.Hours;
            if (date != DateTime.MinValue)
            {
                localDateTime = date.AddHours(-timeOffset);
                // переводим в локальное время
                localDateTime = zone.ToLocalTime(localDateTime);
            }

            return localDateTime.ToString(Config.Instance.ForumDisplayConfig.DateFormat);
        }
    }
}